import axios from 'axios'
import store from '@/store'
import router from '@/router'

const service = axios.create({
    timeout: 4000
})

//添加请求拦截器，若token存在则在请求头中加token，不存在也继续请求
service.interceptors.request.use(
    config => {
        // 每次发送请求之前都检测vuex是否存有token,放在请求头发送给服务器
        // Authorization是根据后端自定义字段
        config.headers.token = store.getters.getToken;
        // console.log(config.headers)
        return config;
    },
    error => {
        console.log("在request拦截器显示错误：", error.response)
        return Promise.reject(error);
    }
);

//response拦截器
service.interceptors.response.use(
    response => {
        console.log(response.data)
        // 在status正确的情况下，code不正确则返回对应的错误信息（后台自定义为200是正确，并且将错误信息写在message），正确则返回响应
        if (response.status === 200) {
            return response;
        }else {
            if (response.data.code === 401) {
                // 401, token失效
                // 清除token并跳转到登录页面
                this.$store.commit("delToken");
                this.$store.commit("delNickname");
                router.replace({
                    path: '/login',
                    query: {redirect: router.currentRoute.fullPath}
                })
                return Promise.reject(new Error("token失效"));
            }
        }
    },
    error => {
        console.log(error)
        // 在status不正确的情况下，判别status状态码给出对应响应
        if (error.response) {
            console.log("在response拦截器显示错误：", error.response)
            switch (error.response.status) {
                case 401:
                    //可能是token过期，清除它
                    this.$store.commit("delToken");
                    this.$store.commit("delNickname");
                    router.replace({ //跳转到登录页面
                        path: '/login',
                        // 将跳转的路由path作为参数，登录成功后跳转到该路由
                        query: { redirect: router.currentRoute.fullPath }
                    });
            }
        }
        return Promise.reject(error.response.data);
    }
);

function request(options) {
    // 定义提交的方式,默认为get
    options.method = options.method || 'get'
    if (options.method.toLowerCase() === 'get') {
        options.params = options.data
    }
    return service(options)
}

// 封装get,post,put    request.get(url,data,options) request.post(url,datea,options)
['get', 'post', 'put', 'delete', 'patch'].forEach((item) => {
    request[item] = (url, data, options) => {
        return request({ method: item, url, data, ...options })
    }
})

export default request;
